# -*- coding: utf-8 -*-

# Create your views here.
from django.contrib.auth.decorators import login_required
from revenda.models import *
from configuracao.models import Dados
from django.http.response import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render_to_response
from django.template.context import RequestContext
import re
from django.core import serializers
from django.utils.datetime_safe import datetime
from django.template.defaultfilters import slugify

@login_required
def empresa_add(request):
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    
    if request.method == "POST":
        nome = request.POST['nome'].strip()
        slug = slugify(nome)
        site = request.POST['site'].strip()
        
        if len(nome) > 0:
            continuar = True
        else:
            request.session['aviso'] = 'Informe o nome da empresa'
            continuar = False
        
        # Efetiva a criação da empresa
        if continuar:
            empresa = Empresa(nome = nome, slug = slug, site = site)
            empresa.save()
            
            if Caixa_geral.objects.all().count() > 0:
                caixa_geral = Caixa_geral.objects.all()[0]
            else:
                caixa_geral = Caixa_geral()
                caixa_geral.save()
            
            caixa = Caixa(caixa_geral = caixa_geral, empresa = empresa)
            caixa.save()
            
            request.session['mensagem'] = 'A empresa <strong>' + str(empresa) + '</strong> foi adicionada com êxito.'
            del nome, slug, site
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    titulo = header = 'Adicionar empresa'
    css = 'revenda/empresa'
    
    return render_to_response(
        'revenda/empresa/add.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
def empresa(request, empresa_slug):
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    
    if Empresa.objects.filter(slug = empresa_slug).count() > 0:
        empresa = Empresa.objects.get(slug = empresa_slug)
        
        campanhas_abertas = Campanha.objects.filter(empresa = empresa, concluido = False).order_by('-inicio')
        
        mensagem = False
        aviso = False
        if request.session.has_key('mensagem'):
            mensagem = request.session['mensagem']
            del request.session['mensagem']
        if request.session.has_key('aviso'):
            aviso = request.session['aviso']
            del request.session['aviso']
        
        titulo = header = empresa.nome
        css = 'home'
        
        return render_to_response(
            'revenda/empresa.html', locals(),
            context_instance=RequestContext(request)
        )
    else:
        request.session['aviso'] = u'Você tentou acessar uma página inválida ou inexistente'
        return HttpResponseRedirect('/')

@login_required
def empresa_campanha(request, empresa_slug, campanha_slug):
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    
    if Empresa.objects.filter(slug = empresa_slug).count() > 0 and Campanha.objects.filter(empresa = Empresa.objects.get(slug = empresa_slug), slug = campanha_slug, concluido = False):
        empresa = Empresa.objects.get(slug = empresa_slug)
        campanha = Campanha.objects.get(empresa = empresa, slug = campanha_slug, concluido = False)
        
        if request.method == 'POST':
            nome_cliente = request.POST['nome_cliente'].strip()
            codigo_produto = request.POST['codigo_produto'].strip().replace('-', '')
            quantidade_produto = request.POST['quantidade_produto'].strip()
            nome_produto = request.POST['nome_produto'].strip()
            preco_produto = request.POST['preco_produto'].strip().replace(',', '.')
            pontos_produto = request.POST['pontos_produto'].strip()
            
            # Se todos os dados estiverem Ok
            if nome_cliente != '':
                # Verificar se cliente já é cadastrado
                if Cliente.objects.filter(nome__icontains = nome_cliente).count() > 0:
                    cliente = Cliente.objects.get(nome__icontains = nome_cliente)
                else:
                    cliente = Cliente(nome = nome_cliente)
                    cliente.save()
                continuar = True
            else:
                request.session['aviso'] = 'O nome do cliente deve ser preenchido.'
                continuar = False

            if continuar:
                if codigo_produto == '':
                    request.session['aviso'] = 'O código do produto deve ser informado.'
                    continuar = False

            if continuar:            
                regex = '^\d+$'
                if re.match(regex, quantidade_produto) and int(quantidade_produto) > 0:
                    quantidade_produto = int(quantidade_produto)
                    continuar = True
                else:
                    request.session['aviso'] = 'A quantidade deve ser um valor inteiro maior que zero.'
                    continuar = False
            
            if continuar:
                if nome_produto == '':
                    request.session['aviso'] = 'O nome do produto deve ser informado.'
                    continuar = False
            
            if continuar:
                regex = '^[0-9]*\.?[0-9]+$'
                if re.match(regex, preco_produto):
                    preco_produto = float(preco_produto)
                    continuar = True
                else:
                    request.session['aviso'] = 'O preço deve ser um valor real'
                    continuar = False
            
            if continuar:
                if pontos_produto != "":
                    pontos_produto = int(pontos_produto)
                    if pontos_produto >= 0:
                        continuar = True
                    else:
                        request.session['aviso'] = 'A quantidade de pontos deve ser um valor inteiro maior que zero.'
                        continuar = False
                else:
                    pontos_produto = 0
                
            if continuar:
                # Verificar se produto já é cadastrado
                if Produto.objects.filter(empresa = empresa, codigo = codigo_produto).count() > 0:
                    produto = Produto.objects.get(empresa = empresa, codigo = codigo_produto)
                    if float(produto.preco_sugerido) != preco_produto:
                        produto.preco_sugerido = preco_produto
                        produto.save()
                    
                    if produto.nome != nome_produto:
                        produto.nome = nome_produto
                        produto.save()
                    
                    if produto.pontos_sugeridos != pontos_produto:
                        produto.pontos_sugeridos = pontos_produto
                        produto.save()
                else:
                    produto = Produto(empresa = empresa, codigo = codigo_produto, nome = nome_produto, preco_sugerido = preco_produto, pontos_sugeridos = pontos_produto)
                    produto.save()
                
                # Tudo ok, agora é só cadastrar o item nesta campanha
                item = Item(campanha = campanha, cliente = cliente, produto = produto, quantidade = quantidade_produto, preco = preco_produto, pontos = pontos_produto)
                item.save()
                
                campanha.total = float(campanha.total) + int(item.quantidade) * float(item.preco)
                campanha.save()
                
                del codigo_produto, quantidade_produto, nome_produto, preco_produto, pontos_produto
                request.session['mensagem'] = 'Item inserido: <strong>' + str(item) + ' - ' + str(item.quantidade) + 'un</strong>. Confira em uma das tabelas abaixo.'
        
        itens = Item.objects.filter(campanha = campanha, ativado = True).order_by('cliente__nome')
        clientes = []
        
        campanha.quantidade_total = 0
        campanha.pontos_total = 0
        campanha.pontos_total_total = 0
        for item in itens:
            campanha.quantidade_total += int(item.quantidade)
            campanha.pontos_total += int(item.pontos)
            campanha.pontos_total_total += int(item.quantidade) * int(item.pontos)
            
            if item.cliente not in clientes:
                item.cliente.quantidade = 0
                item.cliente.pontos = 0
                item.cliente.pontos_total = 0
                item.cliente.preco_total = 0.0
                clientes.append(item.cliente)
        
        for cliente in clientes:
            cliente.itens = itens.filter(cliente = cliente)
            
            for item in cliente.itens:
                item.pontos_total = int(item.pontos) * int(item.quantidade)
                item.preco_total = float(item.preco) * int(item.quantidade) - float(item.valor_pago)
                cliente.quantidade = int(cliente.quantidade) + int(item.quantidade)
                cliente.pontos = int(cliente.pontos) + int(item.pontos)
                cliente.pontos_total = int(cliente.pontos_total) + int(item.pontos_total)
                cliente.preco_total = float(cliente.preco_total) + float(item.preco_total)
        
        campanha.a_receber = float(campanha.total) - float(campanha.recebido)
        
        mensagem = False
        aviso = False
        if request.session.has_key('mensagem'):
            mensagem = request.session['mensagem']
            del request.session['mensagem']
        if request.session.has_key('aviso'):
            aviso = request.session['aviso']
            del request.session['aviso']
        
        titulo = header = campanha
        js = css = 'revenda/empresa'
        
        return render_to_response(
            'revenda/empresa_campanha.html', locals(),
            context_instance=RequestContext(request)
        )
    else:
        request.session['aviso'] = u'Você tentou acessar uma página inválida ou inexistente'
        return HttpResponseRedirect('/')

@login_required
def empresa_campanha_item_remover(request, empresa_slug, campanha_slug, item_id):
    if Item.objects.filter(id = item_id, ativado = True).count() > 0:
        item = Item.objects.get(id = item_id, ativado = True)
        item.ativado = False
        item.campanha.total = float(item.campanha.total) - int(item.quantidade) * float(item.preco)
        item.campanha.recebido = float(item.campanha.recebido) - int(item.valor_pago)
        item.campanha.save()
        item.save()
        
        caixa = Caixa.objects.get(empresa = item.campanha.empresa)
        caixa.valor_recebido = float(caixa.valor_recebido) - float(item.valor_pago)
        caixa.caixa_geral.valor_recebido = float(caixa.caixa_geral.valor_recebido) - float(item.valor_pago)
        caixa.caixa_geral.save()
        caixa.save()
        request.session['mensagem'] = 'Item removido. <a href="' + item.campanha.get_absolute_url() + 'item/remover/desfazer/' + item_id + '/' + '">Desfazer</a>.'
        return HttpResponseRedirect(item.campanha.get_absolute_url())
    else:
        request.session['aviso'] = 'Este item não existe.'
        return HttpResponseRedirect('/revenda/empresa/' + empresa_slug + '/' + campanha_slug + '/')

@login_required
def empresa_campanha_item_remover_desfazer(request, empresa_slug, campanha_slug, item_id):
    if Item.objects.filter(id = item_id, ativado = False).count() > 0:
        item = Item.objects.get(id = item_id, ativado = False)
        item.ativado = True
        item.campanha.total = float(item.campanha.total) + int(item.quantidade) * float(item.preco)
        item.campanha.recebido = float(item.campanha.recebido) + int(item.valor_pago)
        item.campanha.save()
        item.save()
        
        caixa = Caixa.objects.get(empresa = item.campanha.empresa)
        caixa.valor_recebido = float(caixa.valor_recebido) + float(item.valor_pago)
        caixa.caixa_geral.valor_recebido = float(caixa.caixa_geral.valor_recebido) + float(item.valor_pago)
        caixa.caixa_geral.save()
        caixa.save()
        request.session['mensagem'] = 'A sua ação foi recuperada.'
        return HttpResponseRedirect(item.campanha.get_absolute_url())
    else:
        request.session['mensagem'] = 'Ação indisponível.'
        return HttpResponseRedirect('/revenda/empresa/' + empresa_slug + '/' + campanha_slug + '/')

@login_required
def empresa_campanha_finalizar(request, empresa_slug, campanha_slug):
    if Campanha.objects.filter(slug = campanha_slug, concluido = False).count() > 0:
        campanha = Campanha.objects.get(slug = campanha_slug, concluido = False)
        campanha.concluido_em = datetime.now()
        campanha.save()
        
        request.session['mensagem'] = u'A campanha ' + campanha.nome + u' foi finalizada. Para reativá-la, vá em /admin/revenda/campanha/' + str(campanha.id) + u'/ e exclua a data de conclusão, ou clique em <a href="/revenda/empresa/' + empresa_slug + '/' + campanha_slug + '/finalizar/desfazer/">desfazer</a>.'
        return HttpResponseRedirect('/revenda/empresa/' + empresa_slug + '/' )
    else:
        request.session['aviso'] = 'Ação indisponível para a campanha fornecida.'
        return HttpResponseRedirect('/revenda/empresa/' + empresa_slug + '/' + campanha_slug + '/')

@login_required
def empresa_campanha_finalizar_desfazer(request, empresa_slug, campanha_slug):
    if Campanha.objects.filter(slug = campanha_slug, concluido = True).count() > 0:
        campanha = Campanha.objects.get(slug = campanha_slug, concluido = True)
        campanha.concluido_em = None
        campanha.save()
        
        request.session['mensagem'] = u'A campanha ' + campanha.nome + u' foi reaberta.'
        return HttpResponseRedirect('/revenda/empresa/' + empresa_slug + '/' + campanha_slug + '/')
    else:
        request.session['aviso'] = 'Ação indisponível.'
        return HttpResponseRedirect('/revenda/empresa/' + empresa_slug + '/' )

@login_required
def codigo(request):
    if request.is_ajax():
        item_id = int(request.POST['item_id'])
        codigo = request.POST['codigo']
        
        item = Item.objects.get(id = item_id)
        if item.produto.codigo != codigo:
            item.produto.codigo = codigo
            item.produto.save()
            request.session['mensagem'] = 'Código alterado.'
        
        return HttpResponse(None)
    else:
        return HttpResponse(None)

@login_required
def quantidade(request):
    if request.is_ajax():
        item_id = int(request.POST['item_id'])
        quantidade = int(request.POST['quantidade'])
        
        item = Item.objects.get(id = item_id)
        if item.quantidade != quantidade:
            item.campanha.total = float(item.campanha.total) - int(item.quantidade) * float(item.preco)
            item.campanha.save()
            item.quantidade = quantidade
            item.campanha.total = float(item.campanha.total) + int(item.quantidade) * float(item.preco)
            item.campanha.save()
            item.save()
            request.session['mensagem'] = 'Quantidade alterada.'
        
        return HttpResponse(None)
    else:
        return HttpResponse(None)

@login_required
def pontos(request):
    if request.is_ajax():
        item_id = int(request.POST['item_id'])
        pontos = int(request.POST['pontos'])
        
        item = Item.objects.get(id = item_id)
        if item.pontos != pontos:
            item.pontos = pontos
            item.produto.pontos_sugeridos = pontos
            item.produto.save()
            item.save()
            request.session['mensagem'] = 'Quantidade de pontos alterada.'
        
        return HttpResponse(None)
    else:
        return HttpResponse(None)

@login_required
def preco(request):
    if request.is_ajax():
        item_id = int(request.POST['item_id'])
        preco = float(request.POST['preco'].replace(',', '.'))
        
        item = Item.objects.get(id = item_id)
        if float(item.preco) != preco:
            item.campanha.total = float(item.campanha.total) - int(item.quantidade) * float(item.preco)
            item.campanha.save()
            item.preco = preco
            item.campanha.total = float(item.campanha.total) + int(item.quantidade) * float(item.preco)
            item.campanha.save()
            item.save()
            request.session['mensagem'] = 'Preço alterado.'
        
        return HttpResponse(None)
    else:
        return HttpResponse(None)

@login_required
def valor_pago(request):
    if request.is_ajax():
        item_id = int(request.POST['item_id'])
        valor_pago = float(request.POST['valor_pago'].replace(',', '.'))
        
        item = Item.objects.get(id = item_id)
        caixa = Caixa.objects.get(empresa = item.campanha.empresa)
        if float(item.valor_pago) != valor_pago:
            item.campanha.recebido = float(item.campanha.recebido) - float(item.valor_pago)
            caixa.valor_recebido = float(caixa.valor_recebido) - float(item.valor_pago)
            caixa.caixa_geral.valor_recebido = float(caixa.caixa_geral.valor_recebido) - float(item.valor_pago)
            caixa.caixa_geral.save()
            caixa.save()
            item.campanha.save()
            item.valor_pago = valor_pago
            item.campanha.recebido = float(item.campanha.recebido) + float(item.valor_pago)
            caixa.valor_recebido = float(caixa.valor_recebido) + float(item.valor_pago)
            caixa.caixa_geral.valor_recebido = float(caixa.caixa_geral.valor_recebido) + float(item.valor_pago)
            caixa.caixa_geral.save()
            caixa.save()
            item.campanha.save()
            item.save()
            request.session['mensagem'] = 'Valor pago alterado.'
        
        return HttpResponse(None)
    else:
        return HttpResponse(None)

@login_required
def clientes(request):
    if request.is_ajax():
        clientes = Cliente.objects.all()
        
        format = 'json'
        mimetype = 'application/json'

        retorno = serializers.serialize(format, clientes)
        return HttpResponse(retorno, mimetype)
    else:
        return HttpResponse(None)

@login_required
def produtos(request):
    if request.is_ajax():
        slug = request.POST['slug']
        empresa = Empresa.objects.get(slug = slug)
        produto = Produto.objects.filter(empresa = empresa)
        
        for p in produto:
            p.preco_sugerido = ("%.2f" % float(p.preco_sugerido)).replace('.', ',')
            p.pontos_sugeridos = "%d" % int(p.pontos_sugeridos)
        
        format = 'json'
        mimetype = 'application/json'

        retorno = serializers.serialize(format, produto)
        return HttpResponse(retorno, mimetype)
    else:
        return HttpResponse(None)


@login_required
def caixas(request):
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    
    caixa_geral = Caixa_geral.objects.all()[0]
    caixa_geral.total = caixa_geral.valor_recebido - caixa_geral.valor_retirado
    
    caixas = Caixa.objects.all()
    for caixa in caixas :
        caixa.total = caixa.valor_recebido - caixa.valor_retirado
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    titulo = header = 'Caixas'
    css = 'home'
    
    return render_to_response(
        'revenda/caixa.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
def caixas_entrada(request, caixa_id):
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    
    if Caixa.objects.filter(id = caixa_id).count() > 0:
        caixa = Caixa.objects.get(id = caixa_id)
        caixa.caixa_geral.total = float(caixa.caixa_geral.valor_recebido) - float(caixa.caixa_geral.valor_retirado)
        
    else:
        return HttpResponseRedirect('/')
    
    if request.method == "POST":
        valor_recebido = float(request.POST['valor_recebido'].strip().replace(',', '.'))
        objetivo = request.POST['objetivo'].strip()
        
        continuar = True
        if valor_recebido < 0:
            request.session['aviso'] = 'Informe um valor real'
            continuar = False
        
        if continuar and objetivo == "":
            request.session['aviso'] = 'Informe o objetivo'
            continuar = False
        
        if continuar:
            entrada = Entrada(caixa = caixa, valor = valor_recebido, objetivo = objetivo)
            entrada.save()
            
            caixa.valor_recebido = float(caixa.valor_recebido) + valor_recebido
            caixa.caixa_geral.valor_recebido = float(caixa.caixa_geral.valor_recebido) + valor_recebido
            caixa.caixa_geral.save()
            caixa.save()
            request.session['mensagem'] = 'O valor foi adicionado. Verifique os valores totais abaixo'
            del valor_recebido, objetivo
    
    caixa.caixa_geral.total = float(caixa.caixa_geral.valor_recebido) - float(caixa.caixa_geral.valor_retirado)
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    titulo = header = 'Caixas - Entrada de valores'
    css = 'home'
    
    return render_to_response(
        'revenda/caixa/entrada.html', locals(),
        context_instance=RequestContext(request)
    )

@login_required
def caixas_retirada(request, caixa_id):
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    
    if Caixa.objects.filter(id = caixa_id).count() > 0:
        caixa = Caixa.objects.get(id = caixa_id)
        caixa.caixa_geral.total = caixa.caixa_geral.valor_recebido - caixa.caixa_geral.valor_retirado
        
    else:
        return HttpResponseRedirect('/')
    
    if request.method == "POST":
        valor_retirado = float(request.POST['valor_retirado'].strip().replace(',', '.'))
        objetivo = request.POST['objetivo'].strip()
        
        continuar = True
        if valor_retirado < 0:
            request.session['aviso'] = 'Informe um valor real'
            continuar = False
        
        if continuar and objetivo == "":
            request.session['aviso'] = 'Informe o objetivo'
            continuar = False
        
        if continuar:
            retirada = Retirada(caixa = caixa, valor = valor_retirado, objetivo = objetivo)
            retirada.save()
            
            caixa.valor_retirado = float(caixa.valor_retirado) + valor_retirado
            caixa.caixa_geral.valor_retirado = float(caixa.caixa_geral.valor_retirado) + valor_retirado
            caixa.caixa_geral.save()
            caixa.save()
            request.session['mensagem'] = 'A retirada foi registrada. Verifique os valores totais abaixo'
            del valor_retirado, objetivo
    
    caixa.caixa_geral.total = float(caixa.caixa_geral.valor_recebido) - float(caixa.caixa_geral.valor_retirado)
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    titulo = header = 'Caixas - Retirada de valores'
    css = 'home'
    
    return render_to_response(
        'revenda/caixa/retirada.html', locals(),
        context_instance=RequestContext(request)
    )
